﻿using System;
using System.Collections.Generic;
using System.Linq;
using Vallejos.Entidades.Enums;
using Vallejos.Entidades.Interfaces;
using Vallejos.Entidades.ModeloDeDatos;
using Vallejos.Datos.Accesos;


namespace Vallejos.Negocio
{
    public class SolicitudBLL
    {
        private readonly PrestamoDAL _prestamo;
        private readonly SeguridadBLL _seguridad;
        private readonly HelperCache _cache;
        private readonly ProductoBLL _producto;

        private readonly SolicitudDAL _solicitud;
        public string UrlPath { get; set; }
        public SolicitudBLL()
        {
            _seguridad = new SeguridadBLL();
            _prestamo = new PrestamoDAL();
            _solicitud = new SolicitudDAL();
            _cache = new HelperCache();
            _producto = new ProductoBLL();
        }

        public Solicitud LeerSolicitud(int idSolicitud, int idLenguaje)
        {
            var solicitud = _solicitud.LeerSolicitud(idSolicitud);

            CargarSolicitudConValores((SolicitudDeAnalisisCrediticio)solicitud, idLenguaje);

            return solicitud;
        }
        public List<EstadoDeAnalisis> LeerEstadosDeAnalisis(int idLenguaje)
        {
            return _cache.ObtenerLista<EstadoDeAnalisis>() ?? _cache.SetearLista(_solicitud.LeerEstadosDeAnalisis(idLenguaje));
        }
        public void CargarSolicitudConValores(Solicitud solicitud, int idLenguaje)
        {
            if (solicitud != null)
            {
                solicitud.Producto = _producto.LeerProducto(solicitud.Producto.Id, idLenguaje);
                solicitud.Beneficiario = (Cliente)_seguridad.LeerPersona(solicitud.Beneficiario.Id, idLenguaje);

                if (solicitud.GetType() == typeof(SolicitudDeAnalisisCrediticio))
                {
                    ((SolicitudDeAnalisisCrediticio)solicitud).Estado =
                        LeerEstadosDeAnalisis(idLenguaje).Single(
                            estado => estado.idEstado == ((SolicitudDeAnalisisCrediticio)solicitud).Estado.idEstado);

                    ((SolicitudDeAnalisisCrediticio)solicitud).Historial.ForEach(historial => historial.Estado =
                        LeerEstadosDeAnalisis(idLenguaje).Single(
                            estado => estado.idEstado == historial.Estado.idEstado));
                }
                else
                {
                    ((SolicitudDePrestamo)solicitud).Estado =
                        _prestamo.LeerEstadosDePrestamo(idLenguaje).Single(
                            estado => estado.idEstado == ((SolicitudDePrestamo)solicitud).Estado.idEstado);

                    ((SolicitudDePrestamo)solicitud).Historial.ForEach(historial => historial.Estado =
                        _prestamo.LeerEstadosDePrestamo(idLenguaje).Single(
                            estado => estado.idEstado == historial.Estado.idEstado));
                }
            }
        }


    }
}
